/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * dlgLogin.java
 *
 * Created on Oct 17, 2011, 12:50:14 AM
 */

package visual.Seguridad;

import bentity.beUsuario;
import blogic.blUsuario;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.KeyStroke;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.text.*;
/**
 *
 * @author renzo
 */
public class dlgLogin extends javax.swing.JDialog {
    public static final int L_VALIDO = 0;
    public static final int L_INVALIDO = 1;
    public static final int L_CANCELADO = 2;
    private blUsuario gestorUsuarios = new blUsuario();

    private beUsuario usuario = null;
    private int resultado = this.L_INVALIDO;
    private int intentosFallidos = 0;

    /** Creates new form dlgLogin */
    public dlgLogin(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        this.txtUsuario.setDocument(new JTextFieldLimit(20));
        this.pwdConstrasenha.setDocument(new JTextFieldLimit(15));
        visualHelper.centrarDialogoEnPantalla(this);
        addEscapeKey();
        addEnterKey();
    }

    private void addEscapeKey (){
    // Handle escape key to close the dialog

        KeyStroke escape = KeyStroke.getKeyStroke (KeyEvent.VK_ESCAPE, 0, false);
        Action escapeAction = new AbstractAction (){
            public void actionPerformed (ActionEvent e){
                System.exit(0);                
            }
        };
        getRootPane ().getInputMap (JComponent.WHEN_IN_FOCUSED_WINDOW).put (escape, "ESCAPE");
        getRootPane ().getActionMap ().put ("ESCAPE", escapeAction);
    }

    private void addEnterKey (){
    // Handle escape key to close the dialog

        KeyStroke escape = KeyStroke.getKeyStroke (KeyEvent.VK_ENTER, 0, false);
        Action escapeAction = new AbstractAction (){
            public void actionPerformed (ActionEvent e){
                ingreso();
            }
        };
        getRootPane ().getInputMap (JComponent.WHEN_IN_FOCUSED_WINDOW).put (escape, "ENTER");
        getRootPane ().getActionMap ().put ("ENTER", escapeAction);
    }


    public void mostrarMensajeCancelado(){
        visualHelper.mostrarMensajeError("Se canceló el acceso al sistema.");
    }

    public void mostrarMensajeInvalido(){
        visualHelper.mostrarMensajeError("El usuario o contraseña no son válidos");
    }

    public void mostrarMensajeBloqueado(){
        visualHelper.mostrarMensajeError("Usted ha excedido el número máximo de intentos.\n El usuario ha sido bloqueado.");
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        pnlImagen = new javax.swing.JPanel();
        lblImagen = new javax.swing.JLabel();
        lblUsuario = new javax.swing.JLabel();
        txtUsuario = new javax.swing.JTextField();
        lblContrasenha = new javax.swing.JLabel();
        pwdConstrasenha = new javax.swing.JPasswordField();
        btnIngresar = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Thor Store - Login");
        setAlwaysOnTop(true);
        setMinimumSize(new java.awt.Dimension(350, 350));
        setModal(true);
        setResizable(false);
        getContentPane().setLayout(null);

        lblImagen.setIcon(new javax.swing.ImageIcon(getClass().getResource("/thorstore logo 2.png"))); // NOI18N

        javax.swing.GroupLayout pnlImagenLayout = new javax.swing.GroupLayout(pnlImagen);
        pnlImagen.setLayout(pnlImagenLayout);
        pnlImagenLayout.setHorizontalGroup(
            pnlImagenLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlImagenLayout.createSequentialGroup()
                .addGap(23, 23, 23)
                .addComponent(lblImagen)
                .addContainerGap(27, Short.MAX_VALUE))
        );
        pnlImagenLayout.setVerticalGroup(
            pnlImagenLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlImagenLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lblImagen)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        getContentPane().add(pnlImagen);
        pnlImagen.setBounds(10, 10, 330, 118);

        lblUsuario.setFont(new java.awt.Font("Dialog", 0, 12));
        lblUsuario.setForeground(new java.awt.Color(0, 0, 0));
        lblUsuario.setText("Usuario");
        getContentPane().add(lblUsuario);
        lblUsuario.setBounds(20, 150, 48, 15);

        txtUsuario.setForeground(new java.awt.Color(0, 0, 0));
        txtUsuario.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txtUsuarioKeyTyped(evt);
            }
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtUsuarioKeyPressed(evt);
            }
        });
        getContentPane().add(txtUsuario);
        txtUsuario.setBounds(150, 140, 170, 28);

        lblContrasenha.setFont(new java.awt.Font("Dialog", 0, 12));
        lblContrasenha.setForeground(new java.awt.Color(0, 0, 0));
        lblContrasenha.setText("Contraseña");
        getContentPane().add(lblContrasenha);
        lblContrasenha.setBounds(20, 190, 73, 15);

        pwdConstrasenha.setForeground(new java.awt.Color(0, 0, 0));
        pwdConstrasenha.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                pwdConstrasenhaKeyTyped(evt);
            }
            public void keyPressed(java.awt.event.KeyEvent evt) {
                pwdConstrasenhaKeyPressed(evt);
            }
        });
        getContentPane().add(pwdConstrasenha);
        pwdConstrasenha.setBounds(150, 190, 170, 28);

        btnIngresar.setBackground(new java.awt.Color(240, 235, 226));
        btnIngresar.setFont(new java.awt.Font("Dialog", 0, 12));
        btnIngresar.setForeground(new java.awt.Color(0, 0, 0));
        btnIngresar.setText("Ingresar");
        btnIngresar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnIngresarActionPerformed(evt);
            }
        });
        getContentPane().add(btnIngresar);
        btnIngresar.setBounds(60, 250, 90, 27);

        btnCancelar.setBackground(new java.awt.Color(240, 235, 226));
        btnCancelar.setFont(new java.awt.Font("Dialog", 0, 12));
        btnCancelar.setForeground(new java.awt.Color(0, 0, 0));
        btnCancelar.setText("Cancelar");
        btnCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelarActionPerformed(evt);
            }
        });
        getContentPane().add(btnCancelar);
        btnCancelar.setBounds(169, 250, 100, 27);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnIngresarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnIngresarActionPerformed
        this.ingreso();
}//GEN-LAST:event_btnIngresarActionPerformed

    private void ingreso(){
        
        //Validaciones
        if (this.txtUsuario.getText().equals("")){
                visualHelper.mostrarMensajeError("Debe de llenar el campo Usuario.");
                return;
        }

        if (this.pwdConstrasenha.getPassword().length==0){
                visualHelper.mostrarMensajeError("Debe de llenar el campo Contrasenha.");
                return;
        }


        try{            
            this.usuario = gestorUsuarios.queryByNombre(this.txtUsuario.getText());
            encriptado encriptador = new encriptado();

            if (this.usuario==null) {
                this.calcularIntentosFallidos(this.intentosFallidos + 1,usuario);
                this.mostrarMensajeInvalido();
                return;
            }
                
            //Se valida que el usuario no haya iniciado sesion
            if (this.usuario.getIngreso()){
                visualHelper.mostrarMensajeError("El usuario ya ha iniciado sesion en otro equipo.");
                return;
            }

            //Se valida que el usuario no se ecnuettre Bloqueado
            if (this.usuario.getEstado()!=beUsuario.U_ACTIVO){
                visualHelper.mostrarMensajeError("El usuario esta bloqueado. Pongase en contacto con el administrador.");
                return;
            }
                
            //Se valida que la contrasenha ingresada es correcta
            if (this.usuario.getContrasenha().equals(encriptador.encriptar(String.valueOf(this.pwdConstrasenha.getPassword())))){                
                this.setResultado(this.L_VALIDO);
                this.usuario.setIngreso(true);
                gestorUsuarios.modificar(this.usuario);
                this.setVisible(false);
            } else {
                //Se registra la cantidad de intentos fallidos
                this.calcularIntentosFallidos(this.intentosFallidos + 1,usuario);
                this.mostrarMensajeInvalido();
            }

        }
        catch (Exception e){
                e.printStackTrace();
                this.mostrarMensajeInvalido();
        }
    }

    private void calcularIntentosFallidos(int intentosFallidos, beUsuario usuario){
        this.setIntentosFallidos(intentosFallidos);
        if (intentosFallidos>=3){
            try{
                if (usuario==null){
                    visualHelper.mostrarMensajeError("Usted ha sobrepasado el número "
                            + "de intentos válidos. El sistema se cerrará.");
                }
                else{
                    usuario.setEstado(beUsuario.U_BLOQUEADO);
                    this.gestorUsuarios.modificar(usuario);
                    this.mostrarMensajeBloqueado();
                    this.setResultado(dlgLogin.L_CANCELADO);
                    this.setVisible(false);
                }
                System.exit(0);
            }catch (Exception e){
                e.printStackTrace();
                visualHelper.mostrarMensajeError("No se puede tener acceso al usuario.");
            }
            
        }
    }

    private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelarActionPerformed
        // TODO add your handling code here:
        this.setResultado(dlgLogin.L_CANCELADO);
        this.setVisible(false);
    }//GEN-LAST:event_btnCancelarActionPerformed

    private void txtUsuarioKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtUsuarioKeyPressed
        // TODO add your handling code here:
        visualHelper.deshabilitaCtrlV(evt);        
    }//GEN-LAST:event_txtUsuarioKeyPressed

    private void txtUsuarioKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtUsuarioKeyTyped
        // TODO add your handling code here:
        visualHelper.soloTextoyNumeros(evt);
    }//GEN-LAST:event_txtUsuarioKeyTyped

    private void pwdConstrasenhaKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_pwdConstrasenhaKeyTyped
        // TODO add your handling code here:
        visualHelper.soloTextoyNumeros(evt);
    }//GEN-LAST:event_pwdConstrasenhaKeyTyped

    private void pwdConstrasenhaKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_pwdConstrasenhaKeyPressed
        // TODO add your handling code here:
        visualHelper.deshabilitaCtrlV(evt);
    }//GEN-LAST:event_pwdConstrasenhaKeyPressed

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                dlgLogin dialog = new dlgLogin(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnIngresar;
    private javax.swing.JLabel lblContrasenha;
    private javax.swing.JLabel lblImagen;
    private javax.swing.JLabel lblUsuario;
    private javax.swing.JPanel pnlImagen;
    private javax.swing.JPasswordField pwdConstrasenha;
    private javax.swing.JTextField txtUsuario;
    // End of variables declaration//GEN-END:variables

    /**
     * @return the usuario
     */
    public beUsuario getUsuario() {
        return usuario;
    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(beUsuario usuario) {
        this.usuario = usuario;
    }

    /**
     * @return the resultado
     */
    public int getResultado() {
        return resultado;
    }

    /**
     * @param resultado the resultado to set
     */
    public void setResultado(int resultado) {
        this.resultado = resultado;
    }

    public int getIntentosFallidos() {
        return intentosFallidos;
    }

    public void setIntentosFallidos(int intentosFallidos) {
        this.intentosFallidos = intentosFallidos;
    }

    public class JTextFieldLimit extends PlainDocument {
          private int limit;
          // optional uppercase conversion
          private boolean toUppercase = false;

          JTextFieldLimit(int limit) {
           super();
           this.limit = limit;
           }

          JTextFieldLimit(int limit, boolean upper) {
           super();
           this.limit = limit;
           toUppercase = upper;
           }

          public void insertString
            (int offset, String  str, AttributeSet attr)
              throws BadLocationException {
           if (str == null) return;

           if ((getLength() + str.length()) <= limit) {
             if (toUppercase) str = str.toUpperCase();
             super.insertString(offset, str, attr);
             }
           }
    }

}
